package com.householditemtwo.common.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC操作工具类
 * @author Administrator
 *
 */
public class DBManager {
	/**
	 * 定义4个静态常量，分别是驱动名称、数据库地址、用户名、密码
	 */
	private final static String DRIVER = "com.mysql.jdbc.Driver";
	private final static String URL="jdbc:mysql://localhost:3306/householditems?serverTimezone=GMT%2B8&characterEncoding=utf-8";
	private final static String USER = "root";
	private final static String PWD = "admin";
	
	/**
	 * 	获取数据库连接（包含了加载驱动）
	 * @return
	 */
	public static Connection getConnection() {
		
		try {
			//1、加载驱动
			Class.forName(DRIVER);
			//2、连接数据库，并返回连接
			return DriverManager.getConnection(URL, USER, PWD);
		} catch (ClassNotFoundException e) {
			// 当驱动找不到时，就进来这里打印报错信息
			e.printStackTrace();
		} catch (SQLException e) {
			// 当数据库地址或者用户名或密码有误时，就进来这里打印报错信息
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	   *  关闭资源，根据资源是否为空来关闭
	 * @param con
	 * @param st
	 * @param rs
	 */
	public static void closeAll(Connection con, Statement st, ResultSet rs) {
		
		try {
			if(con != null) {
				con.close();
			}
			if(st != null) {
				st.close();
			}
			if(rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			// 当关闭异常时，进来打印错误信息
			e.printStackTrace();
		}
		
	}
	
	
	/**
	  *      简化jdbc增删改操作： 直接执行增删改的sql，包含了jdbc的所有步骤
	 * @param sql
	 * @return 受影响行数
	 */
	public static int executeUpdate(String sql) {
		Connection con = null;
		Statement st = null;
		try {
			//1、获取连接（调用上面写的获取连接方法，包含了加载驱动）
			con = getConnection();
			//2、创建statement
			st = con.createStatement();
			//3、发送sql给数据库执行
			return st.executeUpdate(sql);
		} catch (SQLException e) {
			// 当sql错误时，进来打印错误信息
			e.printStackTrace();
			return 0;
		} finally {
			// 不管是正常执行成功还是有报错，都会进到这里执行，即finally是必执行的
			// 4、关闭资源
			closeAll(con, st, null);
		}
		
	}
	
	
	/**
	 *	 简化jdbc查询操作： 直接执行查询的sql，包含了jdbc的除了处理结果和关闭资源以外的所有步骤
	 * @param sql
	 * @return
	 */
	public static QueryDataResult executeQuery(String sql) {
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		try {
			//1、获取连接（调用上面写的获取连接方法，包含了加载驱动）
			conn = getConnection();
			//2、根据连接创建出能够发送sql的Statement
			st = conn.createStatement();
			//3、发送sql
			rs = st.executeQuery(sql);
			return new QueryDataResult(conn, st, rs);
		} catch (SQLException e) {
			// 当sql有误，进来打印错误信息
			e.printStackTrace();
			// 当有异常时，也应该关闭资源
			closeAll(conn, st, rs);
			return null;
		}
		
	}
	
}
